package kernel.web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


public class Page implements Serializable {

    private static final long serialVersionUID = 1L;
    // 页面数据列表
    private List elements = new ArrayList();
    // 页面记录数
    private int pageSize = 10;
    public final static int DEFAULT_PAGE_SIZE = 10;
    // 当前页码
    private int thisPageNumber = 1;
    // 总数据条数
    private int totalElements = 0;
    // 默认的空结果
    public static final Page EMPTY_PAGE = new Page();

    public Page() {

    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public void setThisPageNumber(int thisPageNumber) {
        if (thisPageNumber > 0) {
            this.thisPageNumber = thisPageNumber;
        }
        if (this.thisPageNumber > getTotalPage()) {
            this.thisPageNumber = getTotalPage();
        }
    }

    /**
     * 构造方法，初始化页面参数
     * 
     * @param thisPageNumber
     *            当前页码
     * @param pageSize
     *            页面数据数
     * @param totalElements
     *            总数据条数
     */
    public Page(int thisPageNumber, int pageSize, int totalElements) {

        if (thisPageNumber > 0) {
            this.thisPageNumber = thisPageNumber;
        }
        if (pageSize > 0) {
            this.pageSize = pageSize;
        }
        if (totalElements > 0) {
            this.totalElements = totalElements;
        }
        if (this.thisPageNumber > getTotalPage()) {
            this.thisPageNumber = getTotalPage();
        }

    }

    /**
     * 是否是首页（第一页），第一页页码为1
     * 
     * @return 首页标识
     */
    public boolean isFirstPage() {

        return getThisPageNumber() == 1;
    }

    /**
     * 是否是最后一页
     * 
     * @return 末页标识
     */
    public boolean isLastPage() {

        return getThisPageNumber() >= getTotalPage();
    }

    /**
     * 是否有下一页
     * 
     * @return 下一页标识
     */
    public boolean hasNextPage() {

        return getTotalPage() > getThisPageNumber();
    }

    /**
     * 是否有上一页
     * 
     * @@return 上一页标识
     */
    public boolean hasPreviousPage() {

        return getThisPageNumber() > 1;
    }

    /**
     * 获取最后一页页码，也就是总页数
     * 
     * @return 最后一页页码
     */
    public int getTotalPage() {

        return totalElements % this.pageSize == 0 ? totalElements
                / this.pageSize : totalElements / this.pageSize + 1;
    }

    /**
     * 返回当前页面数据列表
     * 
     * @return 页面数据列表
     */
    public List getElements() {
        return elements;
    }

    public void setElements(List elements) {
        this.elements = elements;
    }

    /**
     * 总的数据条目数量，0表示没有数据
     * 
     * @return 总数量
     */
    public int getTotalElements() {

        return totalElements;
    }
    public void setTotalElements(int totalElements) {
        if (totalElements > 0) {
            this.totalElements = totalElements;
        }
        if (this.thisPageNumber > getTotalPage()) {
            this.thisPageNumber = getTotalPage();
        }
    }

    /**
     * 获取当前页的首条数据的行编码
     * 
     * @return 当前页的首条数据的行编码
     */
    public int getFirstElementNumber() {

        return (getThisPageNumber() - 1) * getPageSize();
    }

    /**
     * 获取当前页的末条数据的行编码
     * 
     * @return 当前页的末条数据的行编码
     */
    public int getLastElementNumber() {

        int fullPage = getFirstElementNumber() + getPageSize() - 1;
        return getTotalElements() < fullPage ? getTotalElements() : fullPage;
    }

    /**
     * 获取下一页编码
     * 
     * @return 下一页编码
     */
    public int getNextPageNumber() {

        return getThisPageNumber() + 1;
    }

    /**
     * 获取上一页编码
     * 
     * @return 上一页编码
     */
    public int getPreviousPageNumber() {

        return getThisPageNumber() - 1;
    }

    /**
     * 每一页显示的条目数
     * 
     * @return 每一页显示的条目数
     */
    public int getPageSize() {

        return pageSize;
    }

    /**
     * 当前页的页码
     * 
     * @return 当前页的页码
     */
    public int getThisPageNumber() {

        return thisPageNumber;
    }

    public int getFirstPage() {
        // TODO Auto-generated method stub
        return 1;
    }

}
